
use std::thread;
use std::sync::{Mutex, Arc};
use std::rc::Rc;

fn main() {
    // 这里不能使用 Rc<T> 因为他不是跨线程安全的，因为它没有使用任何原语来保证修改计数的过程不会被另一个线程打断。
    // let counter = Rc::new(Mutex::new(0)) ;
    let counter = Arc::new(Mutex::new(0)) ;
    let mut handles = vec![];

    for _ in 0..10 {
        // Rc 和 Arc 的接口方法一致，直接对调就可以了，不能用Rc 多线程要用 Arc 直接记下结论也可以。
        // let counter = Rc::clone(&counter);
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result {}", *counter.lock().unwrap());
}
